// Copyright (C) 2015 André Bargull. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
es6id: 25.4.4.1.2
description: >
  Cannot change result value of resolved Promise.all elements.
info: |
  Promise.all Resolve Element Functions

  1. Let alreadyCalled be the value of F's [[AlreadyCalled]] internal slot.
  2. If alreadyCalled.[[value]] is true, return undefined.
  3. Set alreadyCalled.[[value]] to true.
  ...
---*/

function Test() {
    var callCount = 0;

    function Constructor(executor) {
      function resolve(values) {
        callCount += 1;
        assert(Array.isArray(values), "values is array");
        assert.sameValue(values.length, 2, "values length");
        assert.sameValue(values[0], "expectedValue-p1", "values[0]");
        assert.sameValue(values[1], "expectedValue-p2", "values[1]");
      }
      executor(resolve, Test262Error.thrower);
    }
    Constructor.resolve = function(v) {
      return v;
    };

    var p1 = {
      then: function(onFulfilled, onRejected) {
        onFulfilled("expectedValue-p1");
        onFulfilled("unexpectedValue-p1");
      }
    };
    var p2 = {
      then: function(onFulfilled, onRejected) {
        onFulfilled("expectedValue-p2");
        onFulfilled("unexpectedValue-p2");
      }
    };

    assert.sameValue(callCount, 0, "callCount before call to all()");

    Promise.all.call(Constructor, [p1, p2]);

    assert.sameValue(callCount, 1, "callCount after call to all()");
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
